package com.cx.zyx.modulebiz.user.controller;

import com.cx.zyx.modulebiz.user.controller.vo.LoginReqVO;
import com.cx.zyx.modulebiz.user.controller.vo.LoginResultRespVO;
import jakarta.servlet.http.HttpSession;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/api/auth")
public class AuthController {

    /**
     * 处理用户登录请求，并使用 @Valid 自动验证 LoginReqVO
     *
     * @param loginRequest 通过 @RequestBody 接收客户端提交的 JSON 数据，并映射到 UserRegistrationDto
     * @param result  BindingResult 会自动收集 @Valid 验证过程中产生的所有错误
     * @return ResponseEntity 包含处理结果或验证错误信息
     */
    @PostMapping("/login")
    public ResponseEntity<?> login(@Valid @RequestBody LoginReqVO loginRequest, BindingResult result, HttpSession session) {
        // 1. 检查 BindingResult 中是否包含错误
        if (result.hasErrors()) {
            Map<String, String> errors = new HashMap<>();
            // 遍历所有字段错误，将字段名和错误信息添加到 Map 中
            for (FieldError error : result.getFieldErrors()) {
                errors.put(error.getField(), error.getDefaultMessage());
            }
            // 返回 400 Bad Request 状态码和错误信息
            return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
        }

        // 2. 验证码校验  TODO: 验证码校验逻辑
        String captcha = loginRequest.getCaptcha();

        // 3. 登录验证
        String account = loginRequest.getAccount();
        String password = loginRequest.getPassword();

        LoginResultRespVO loginResultRespVO = new LoginResultRespVO();
        boolean authenticated = true;

        loginResultRespVO.setSuccess(authenticated);
        if (!authenticated) {
            // 登录失败，返回 401 Unauthorized 状态码和错误信息
            return new ResponseEntity<LoginResultRespVO>(loginResultRespVO, HttpStatus.UNAUTHORIZED);
        }
        // 验证成功设置对应会话状态
        session.setAttribute("account", account);

        // 4. 记住登录
        if (loginRequest.isRememberMe()) {
            // TODO: 生成客户端令牌
            session.setAttribute("rememberMe", true);
            session.setAttribute("token", "client_token");
        }

        // 5. 用户登录行为统计
        // TODO: 统计用户登录行为

        // 6. 返回成功响应
        return new ResponseEntity<LoginResultRespVO>(loginResultRespVO, HttpStatus.OK);
    }

    @GetMapping("/captcha")
    public ResponseEntity<?> generateCaptcha() {
        // TODO: 生成验证码逻辑
        return ResponseEntity.ok("Generated captcha");
    }

    @GetMapping("/me")
    public ResponseEntity<?>  whoAmI() {
        // TODO: 获取当前登录用户信息
        return ResponseEntity.ok("Current user information");
    }

    @PostMapping("/logout")
    public ResponseEntity<?> logout() {
        // TODO: 实现登出逻辑
        return ResponseEntity.ok("Logout successful");
    }
}

